package day1;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.concurrent.TimeUnit;

/**
 * redis的分布式锁实现。
 * 这个只是简单的实现，因为它并没有【实现可重复特性】
 * 和【看门狗机制】。
 */
public class RedisLockDemo {

    @Resource
    StringRedisTemplate stringRedisTemplate;

    private static final String UNLOCKSCRIPT =
            "if(redis.call('get',KEYS[1]) == ARGV[1]) then return redis.call('del',KEYS[1]) end return 0";

    private static final String REDISKEY = "redis:key:1";

    //释放锁
    public void unlock(){
        //这段代码，可以实现分布式锁的释放。
        stringRedisTemplate.execute(RedisScript.of(UNLOCKSCRIPT),
                Collections.singletonList(REDISKEY), Thread.currentThread().getId());
    }

    //加锁
    public boolean lock(){
        Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent(REDISKEY, Thread.currentThread().getId() + "",
                10, TimeUnit.SECONDS);
        return aBoolean;
    }

}
